Hilt 稳定版发布 | 更便捷的 Android 依赖项注入
Hilt 是 Jetpack 推荐使用的 Android 应用依赖项注入 (DI) 解决方案,现已稳定。这意味着 Hilt 已经完全可以在生产环境中使用。Hilt 相比 Dagger 更加便捷,同时也能帮您减少模板代码,它专为 Android 而生,并集成了多个 Jetpack 依赖库。很多公司已在他们的应用中使用了 Hilt 并从中获益。
Hilt https://developer.android.google.cn/training/dependency-injection/hilt-android 依赖项注入 (DI) https://developer.android.google.cn/training/dependency-injection
首次发布 https://medium.com/androiddevelopers/dependency-injection-on-android-with-hilt-67b6031e62d
配置 Hilt 之后 https://developer.android.google.cn/training/dependency-injection/hilt-android#setup
@HiltAndroidApp // 在应用中配置 Hilt
class MyApplication : Application() { ... }
// 使 Hilt 识别该 ViewModel
@HiltViewModel
class LoginViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
/*…Hilt 关注的其他依赖项... */
) : ViewModel() { ... }
// 使该 Activity 使用正确的 ViewModel 工厂,并注入其他依赖项
@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {
private val loginViewModel: LoginViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// loginViewModel 已经可以使用
}
}
比 Dagger 更便捷
Dagger https://developer.android.google.cn/training/dependency-injection/dagger-basics
我强烈推荐利用 Dagger 在 Android 应用中进行依赖项注入,然而单纯地使用 Dagger 可能导致在创建时内存占用过多。当这与 Android 开发中各种复杂的可感知生命周期组件一起使用时,就可能出现很多陷阱,例如内存泄漏: 作用域为 Activity 的依赖项被意外地传递到 ViewModel 中。专为 Android 量身定制的 Hilt 可以帮助您避开 Dagger 基本使用的一些陷阱。 ——Tinder 资深软件工程师 Marcelo Hernandez
如果您已经在应用中使用了 Dagger,并且希望迁移到 Hilt,无需担心!Dagger 和 Hilt 可以共存,应用可以基于需要进行迁移。
迁移 https://dagger.dev/hilt/migration-guide
更少的模板代码
Hilt 是被定制过的——这意味着为了减少您编写代码,它替您做了一些决定。Hilt 定义了标准组件及依赖关系图,并且完全集成了 Android Framework 中的类,例如: Application、Activity、Fragment、View,还定义了限制类型实例的作用域到这些组件的作用域注解。
通过 @HiltAndroidTest 注解,Hilt 可以自动生成测试应用以及测试组件。迁移到 Hilt 之后,我们可以删除 20% - 40% 的测试相关模板代码。
——YouTube 软件工程师 Jusun Lee
我们仅是在 Hilt 迁移上做了浅层工作。然而,我们在其中一个迁移到 Hilt 的模块,看到了代码行数 +72/-182 的变化。
——Tinder 资深软件工程师 Marcelo Hernandez
为 Android 量身定制
不同于 Java 编程语言应用的依赖项注入解决方案 Dagger,Hilt 仅支持 Android 应用。一些注解专供 Hilt 使用,并定义了专有的 Android DI 方式,这些注解包括: @HiltAndroidApp、@AndroidEntryPoint、@HiltViewModel。
最终,Hilt 提供了内置的可识别 Android 生命周期的 Dagger 组件。使用 Hilt,我们可以只关注 Dagger @Modules,而不必担心组件,子组件以及组件提供程序的模式等。 —— Tinder 资深软件工程师 Marcelo Hernandez
组件及绑定的标准化
单组件系统 https://dagger.dev/hilt/monolithic
通过 Hilt 的单组件系统,仅一次提供绑定定义,就可以在所有使用该组件的类中共享。这比之前有着很大的提升,YouTube 曾使用多组件系统,模块需要手动连接到自定义组件中,并且存在很多重复的绑定定义。 ——YouTube 软件工程师 Jusun Lee
由于我们的 Gradle 模块分离允许隔离开发功能,这使得我们使用 Dagger 时容易过于灵活。我们发现,将这些模块迁移到 Hilt 暴露出我们无意间违反了关注点分离的缺陷。
——Tinder 资深软件开发工程师 Marcelo Hernandez
集成其他 Jetpack 库
文档 https://developer.android.google.cn/training/dependency-injection/hilt-jetpack
我非常感激 Hilt 与 ViewModel 一起开箱即用的使用方式,以及它消除单纯使用 Dagger 时必须设置的 ViewModel.Factory 模板代码的方式。 ——Tinder 资深软件开发工程师 Marcelo Hernandez
Hilt 学习资源
Hilt 是 Jetpack 推荐的 Android 应用 DI 解决方案。想要了解更多并开始在您的应用中使用,请参阅如下资源:
了解使用依赖项注入的收益
https://developer.android.google.cn/training/dependency-injection
了解如何在您的应用中使用 Hilt
https://developer.android.google.cn/training/dependency-injection/hilt-android 从 Dagger 到 Hilt 的迁移指南 https://dagger.dev/hilt/migration-guide Codelabs 中逐步学习 Hilt 教程:
在 Android 应用中使用 Hilt
https://developer.android.google.cn/codelabs/android-hilt#0 将 Dagger 应用迁移到 Hilt
https://developer.android.google.cn/codelabs/android-dagger-to-hilt#0
代码示例:
Google I/O 2020 应用 https://github.com/google/iosched Sunflower 应用 https://github.com/android/sunflower
Hilt 及 Dagger 注解的区别及使用方式的备忘录 https://services.google.cn/fh/files/misc/hilt-annotations-2.3.3_zh-cn.pdf
推荐阅读